package com.drinkian.aliyun_oss.service.impl;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.drinkian.aliyun_oss.entity.vo.VRanOss;
import com.drinkian.aliyun_oss.service.IAssumeRole;
import com.drinkian.entity.RequestResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;

@Service
public class AssumeRoleImpl implements IAssumeRole {

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.regionId}")
    private String regionId;

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.secret}")
    private String secret;

    @Value("${oss.roleArn}")
    private String roleArn;

    @Value("${oss.bucket}")
    private String bucket;


    @Override
    public RequestResult doGetOssToken(String username) {
        try {
            // 添加endpoint。适用于Java SDK 3.12.0及以上版本。
            DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
            // 添加endpoint。适用于Java SDK 3.12.0以下版本。
            // DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
            // 构造default profile。
            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
            // 构造client。
            DefaultAcsClient client = new DefaultAcsClient(profile);
            AssumeRoleRequest request = new AssumeRoleRequest();
            // 适用于Java SDK 3.12.0及以上版本。
            request.setSysMethod(MethodType.POST);
            // 适用于Java SDK 3.12.0以下版本。
            //request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(username);
            request.setPolicy(null); // 如果policy为空，则用户将获得该角色下所有权限。
            request.setDurationSeconds(3600L); // 设置临时访问凭证的有效时间为3600秒。
            AssumeRoleResponse response = client.getAcsResponse(request);
            VRanOss vRanOss = new VRanOss(response.getCredentials().getAccessKeyId(), response.getCredentials().getAccessKeySecret(), response.getCredentials().getSecurityToken());
            return new RequestResult(200,vRanOss);
        } catch (ClientException e) {
            e.printStackTrace();
            return new RequestResult(500, "sts服务错误");
        }
    }
}
